package com.heima.user.controller.service.impl;

import cn.hutool.core.convert.Convert;
import cn.hutool.core.map.MapUtil;
import cn.hutool.core.util.ObjectUtil;
import cn.hutool.core.util.StrUtil;
import com.baomidou.mybatisplus.core.toolkit.Wrappers;
import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import com.heima.common.dtos.ResponseResult;
import com.heima.common.enums.AppHttpCodeEnum;
import com.heima.model.user.dtos.LoginDto;
import com.heima.model.user.pojos.ApUser;
import com.heima.user.controller.mapper.ApUserMapper;
import com.heima.user.controller.service.ApUserService;
import com.heima.utils.common.AppJwtUtil;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.stereotype.Service;

import java.lang.module.Configuration;
import java.util.Map;


@Service
public class ApUserServiceImpl extends ServiceImpl<ApUserMapper, ApUser> implements ApUserService {


    @Override
    public ResponseResult<Map<String, Object>> login(LoginDto dto) {
//        手机号 和密码有空的。
        if(StrUtil.hasEmpty(dto.getPassword(),dto.getPhone())){
//           游客登录，然后返回 token  id = 0 就行.
            return ResponseResult.okResult(MapUtil.<String,Object>builder()
                    .put("token", AppJwtUtil.getToken(0L))
                    .build());
        }
//        如果都存在，然后查手机号，是否存在
//        LambdaQueryChainWrapper<ApUser> wrapper = super.lambdaQuery().eq(ApUser::getPhone, dto.getPhone());
//        ApUser apUser = super.getOne(wrapper);
        ApUser apUser = getOne(Wrappers.<ApUser>lambdaQuery().eq(ApUser::getPhone, dto.getPhone()));
        if(ObjectUtil.isEmpty(apUser)){
            return ResponseResult.errorResult(AppHttpCodeEnum.AP_USER_DATA_NOT_EXIST,"用户不能存在");
        }
//        用户存在 ，验证密码 ,通过 slat + password  MD5 加密
        String salt = apUser.getSalt();
        String md5Password = DigestUtils.md5Hex(dto.getPassword() + salt);
        if(ObjectUtil.notEqual(md5Password,apUser.getPassword())){
            return ResponseResult.errorResult(AppHttpCodeEnum.LOGIN_PASSWORD_ERROR,"密码错误");
        }
//        密码正确之后，就返回， 然后 salt 和password  清空
        apUser.setSalt(null);
        apUser.setPassword(null);
        return ResponseResult.okResult(MapUtil.<String ,Object>builder()
                        .put("token",AppJwtUtil.getToken(Convert.toLong(apUser.getId())))
                        .put("user",apUser)
                .build());
    }
}

/*
登录流程。
1.手机号和密码
2，有为空的，就是游客登入。
3，当都不为空的时候，根据手机号去查，该用户存在否？
4，存在，判断密码是否正确，
5，然后进行返回 token, 和用户信息，注意要把 salt 和 密码清空。

 */
